package roleservicelogic

import (
	"context"
	"database/sql"
	"fmt"

	"smile-sunshine-micorservice/rpc/User/db/crud"
	"smile-sunshine-micorservice/rpc/User/internal/svc"
	"smile-sunshine-micorservice/rpc/User/pb/zipTako.com/SmileSunshine/user"

	"github.com/zeromicro/go-zero/core/logx"
)

type UpdateRoleLogic struct {
	ctx    context.Context
	svcCtx *svc.ServiceContext
	logx.Logger
	RolesModel crud.RolesModel
}

func NewUpdateRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *UpdateRoleLogic {
	return &UpdateRoleLogic{
		ctx:        ctx,
		svcCtx:     svcCtx,
		Logger:     logx.WithContext(ctx),
		RolesModel: crud.NewRolesModel(svcCtx.SqlConn, svcCtx.CacheConf),
	}
}

func (l *UpdateRoleLogic) UpdateRole(in *user.UpdateRoleRequest) (*user.UpdateRoleResponse, error) {
	l.Logger.Infof("收到更新角色请求，角色ID：%d", in.Id)

	// 1. 参数验证
	if err := l.validateUpdateRoleRequest(in); err != nil {
		return &user.UpdateRoleResponse{
			Success: false,
			Message: err.Error(),
		}, nil
	}

	// 2. 检查角色是否存在
	role, err := l.RolesModel.FindOne(l.ctx, in.Id)
	if err != nil {
		return &user.UpdateRoleResponse{
			Success: false,
			Message: "角色不存在",
		}, nil
	}

	// 3. 检查角色是否已被删除
	if role.DeletedAt.Valid == true {
		return &user.UpdateRoleResponse{
			Success: false,
			Message: "角色已被删除，无法更新",
		}, nil
	}

	// 4. 检查是否为系统预设角色
	if role.Name == "admin" && in.Name != "admin" {
		return &user.UpdateRoleResponse{
			Success: false,
			Message: "系统预设角色名称不能修改",
		}, nil
	}

	// 5. 检查新角色名是否与其他角色冲突
	if in.Name != role.Name {
		existingRole, err := l.RolesModel.FindOneByName(l.ctx, in.Name)
		if err == nil && existingRole.Id != in.Id {
			return &user.UpdateRoleResponse{
				Success: false,
				Message: "角色名已存在",
			}, nil
		}
	}

	// 6. 更新角色信息
	role.Name = in.Name
	role.Description = sql.NullString{
		String: in.Description,
		Valid:  in.Description != "",
	}

	err = l.RolesModel.Update(l.ctx, role)
	if err != nil {
		l.Logger.Errorf("更新角色失败：%v", err)
		return &user.UpdateRoleResponse{
			Success: false,
			Message: "更新角色失败，请稍后重试",
		}, nil
	}

	// 7. 返回成功响应
	return &user.UpdateRoleResponse{
		Success: true,
		Message: "更新角色成功",
		Role: &user.Role{
			Id:          role.Id,
			Name:        role.Name,
			Description: role.Description.String,
			CreatedAt:   role.CreatedAt.Unix(),
			UpdatedAt:   role.UpdatedAt.Unix(),
		},
	}, nil
}

// validateUpdateRoleRequest 验证更新角色请求参数
func (l *UpdateRoleLogic) validateUpdateRoleRequest(in *user.UpdateRoleRequest) error {
	// 验证ID
	if in.Id <= 0 {
		return fmt.Errorf("无效的角色ID")
	}

	// 验证角色名
	if len(in.Name) < 2 || len(in.Name) > 50 {
		return fmt.Errorf("角色名长度必须在2-50个字符之间")
	}

	// 验证描述（如果提供）
	if len(in.Description) > 200 {
		return fmt.Errorf("角色描述不能超过200个字符")
	}

	return nil
}
